#include "./SeqQueue.h"
#include <stdlib.h>

Status InitQueue(SeqQueue *queue) {
    ElemType *elem = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);

    if(!elem) {
        return ERROR;
    }

    queue->base = elem;
    queue->front = queue->rear = 0;
    return OK;
}

// 销毁
Status DestroyQueue(SeqQueue *queue) {
    if (queue->base) {
        free(queue->base);
    }
    return OK;
}

// 求队列的长度
int QueueLength(SeqQueue queue) {
    // 正常队列, 使用队尾的下标 减去 队头的下标
    // return queue.rear - queue.front

    // 循环队列
    return (queue.rear - queue.rear + MAXSIZE) % MAXSIZE;
}

// 入队, 只能在队尾入队
Status EnQueue(SeqQueue queue, ElemType e) {
    // 先判断队列是否满了,(顺序存储申请的内存空间)
    if((queue.rear+1)%MAXSIZE == queue.front) {
        // 如果要放的位置下标和队头下标相等 则 队满
        return ERROR;
    }
    queue.base[queue.rear] = e;
    // 队尾指针+1
    queue.rear = (queue.rear + 1) % MAXSIZE;
    return OK;
}

// 出队, 只能在队头初队列
Status DeQueue(SeqQueue queue, ElemType *e) {
    if(queue.rear == queue.front) {
        // 队空
        return ERROR;
    }
    *e = queue.base[queue.front];
    // 队头下标加1
    queue.front = (queue.front + 1) % MAXSIZE;
    return OK;
}

// 取队头元素
ElemType GetHead(SeqQueue queue) {
    if(queue.front != queue.rear) {
        // 队不空; 返回队头指针元素的值, 队头指针不变
        return queue.base[queue.front];
    }
    return NULL;
}

int main() {
    SeqQueue seq;
    InitQueue(&seq);
    return 0;
}